package com.self.springframework.aop.aspectj;

import com.self.springframework.aop.Pointcut;
import com.self.springframework.aop.PointcutAdvisor;
import org.aopalliance.aop.Advice;

/**
 * 表达式驱动
 * 完整的切面封装:将切点{@link Pointcut}与通知{@link org.aopalliance.aop.Advice}绑定为完整的单元,形成完整的切面定义
 * 与spring集成:作为spring容器管理的Bean参与AOP代理创建
 * Advisor(通知器/增强器) = Advice（做什么） + Pointcut（在哪里做）
 */
public class AspectJExpressionPointcutAdvisor implements PointcutAdvisor {

    // 切面
    private AspectJExpressionPointcut pointcut;
    // 具体的拦截方法
    private Advice advice;
    // 表达式
    private String expression;

    public void setExpression(String expression){
        this.expression = expression;
    }

    @Override
    public Pointcut getPointcut() {
        if (null == pointcut) {
            pointcut = new AspectJExpressionPointcut(expression);
        }
        return pointcut;
    }

    @Override
    public Advice getAdvice() {
        return advice;
    }

    public void setAdvice(Advice advice){
        this.advice = advice;
    }

}
